/**
 * 参数装饰器
 * 参数装饰器顾名思义，是用来装饰函数参数，它接收三个参数：
 *  target: Object - 被装饰的类
    propertyKey: string | symbol - 方法名
    parameterIndex: number - 方法中参数的索引值

    参数装饰器只能用来监视一个方法的参数是否被传入。  不能用于 constructor

    参数装饰器的 返回值 将被忽略
 */

// ts 里不让直接用 target: Function  使用 Function 表达一个类型 type TFunction = () => void

function Log(target: any, key: string, parameterIndex: number) {
  console.log('key', key)

  const functionLogged = key || target.prototype.constructor.name

  console.log(
    `参数的索引位置 ${parameterIndex} at ${functionLogged} 类使用了参数装饰器`
  )
}

class Greeter {
  greeting: string

  constructor(phrase: string) {
    this.greeting = phrase
  }

  say(@Log text: string, @Log t2: string) {
    console.log(text, t2)
  }
}

const g1 = new Greeter('你好')
console.log(g1)

g1.say('参数装饰器', '第二个参数')
